Switchlayer
根据索引从输入张量数组中选择一个张量,并将其数据复制到输出。该算子不区分数据类型,适用于所有数据类型。
\[\text{output} = \text{input\_tensors}[\text{index}]\]
该算子会将选中的输入张量的数据复制到输出张量中。复制的大小为 size * type_size 字节。
- 输入:
input_tensors - 输入张量数组(TensorC** 类型),包含多个待选择的张量。
index - 选择的索引(int 类型),指定从 input_tensors 数组中选择哪个张量。
core_mask - 核掩码(int),仅共享存储版本需要。
- 输出:
output - 输出张量(TensorC* 类型),包含复制后的数据。输出张量的 size 和 type_size 应与选中的输入张量相同。
- TensorC 结构体定义:
type_size - 数据类型大小(long long),单位字节,例如 float32 为 4,float16 为 2。
size - 元素个数(long long)。
data - 数据指针(void*)。
- 支持平台:
FT78NEMT7004
备注
该算子不区分数据类型,适用于所有数据类型
算子会复制数据,输出张量与输入张量数据独立
调用前需要确保 output->data 指向的内存空间足够大(至少 size * type_size 字节)
选中的输入张量的 size 和 type_size 应与输出张量匹配
共享存储版本:
-
void switchlayer_s(TensorC **input_tensors, TensorC *output, int index, int core_mask)
C调用示例:
1//FT78NE示例
2#include <stdio.h>
3#include <switchlayer.h>
4
5int main(int argc, char* argv[]) {
6 // 假设在DDR空间
7 TensorC input0, input1, input2;
8 TensorC output;
9
10 // 初始化 input0
11 input0.type_size = 4; // float32
12 input0.size = 1000;
13 input0.data = (void *)0xA0000000;
14
15 // 初始化 input1
16 input1.type_size = 4; // float32
17 input1.size = 1000;
18 input1.data = (void *)0xA1000000;
19
20 // 初始化 input2
21 input2.type_size = 4; // float32
22 input2.size = 1000;
23 input2.data = (void *)0xA2000000;
24
25 // 初始化 output
26 output.type_size = 4; // float32
27 output.size = 1000;
28 output.data = (void *)0xB0000000; // 需要预先分配足够的内存
29
30 // 创建输入张量数组
31 TensorC* input_tensors[3] = {&input0, &input1, &input2};
32
33 int index = 1; // 选择 input1
34 int core_mask = 0xff;
35
36 switchlayer_s(input_tensors, &output, index, core_mask);
37
38 // 此时 output.data 包含 input1.data 的副本
39
40 return 0;
41}
私有存储版本:
-
void switchlayer_p(TensorC **input_tensors, TensorC *output, int index)
C调用示例:
1//FT78NE示例
2#include <stdio.h>
3#include <switchlayer.h>
4
5int main(int argc, char* argv[]) {
6 // 假设在L2空间
7 TensorC input0, input1, input2;
8 TensorC output;
9
10 input0.type_size = 4; // float32
11 input0.size = 1000;
12 input0.data = (void *)0x10000000;
13
14 input1.type_size = 4;
15 input1.size = 1000;
16 input1.data = (void *)0x10001000;
17
18 input2.type_size = 4;
19 input2.size = 1000;
20 input2.data = (void *)0x10002000;
21
22 output.type_size = 4;
23 output.size = 1000;
24 output.data = (void *)0x10003000; // 需要预先分配足够的内存
25
26 TensorC* input_tensors[3] = {&input0, &input1, &input2};
27
28 int index = 0; // 选择 input0
29
30 switchlayer_p(input_tensors, &output, index);
31
32 return 0;
33}